package com.heze.xunhuan.utils;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.heze.xunhuan.controller.DevAuthController;
import com.heze.xunhuan.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 模拟微信工具类 - 开发测试专用
 * 在无法访问真实微信API时提供模拟数据
 *
 * @author heze-xunhuan
 */
@Slf4j
@Component
public class MockWechatUtil {

    @Value("${spring.profiles.active:prod}")
    private String activeProfile;

    /**
     * 模拟微信code验证
     * 如果是开发环境或测试环境，提供模拟数据
     * 如果是生产环境，调用真实微信API
     */
    public JSONObject code2Session(String code) {
        // 检查是否为开发/测试环境
        if (isDevelopmentEnvironment()) {
            log.info("开发环境：使用模拟微信登录，code: {}", code);
            return mockCode2Session(code);
        }
        
        // 检查是否为模拟code
        if (DevAuthController.MockCodeData.isMockCode(code)) {
            log.info("检测到模拟code，使用模拟响应: {}", code);
            return mockCode2Session(code);
        }
        
        // 生产环境：调用真实微信API
        log.info("生产环境：调用真实微信API，code: {}", code);
        return realCode2Session(code);
    }
    
    /**
     * 模拟微信code验证响应
     */
    private JSONObject mockCode2Session(String code) {
        JSONObject result = new JSONObject();
        
        // 获取预定义的模拟数据
        DevAuthController.MockCodeInfo mockInfo = DevAuthController.MockCodeData.getMockCodeInfo(code);
        
        if (mockInfo != null) {
            result.set("openid", mockInfo.getOpenid());
            result.set("unionid", mockInfo.getUnionid());
            result.set("session_key", "mock_session_key_" + System.currentTimeMillis());
            result.set("errcode", 0);
            result.set("errmsg", "ok");
        } else {
            // 未识别的code，生成新的模拟数据
            String timestamp = String.valueOf(System.currentTimeMillis());
            result.set("openid", "mock_openid_" + timestamp);
            result.set("unionid", "mock_unionid_" + timestamp);
            result.set("session_key", "mock_session_key_" + timestamp);
            result.set("errcode", 0);
            result.set("errmsg", "ok");
        }
        
        log.info("模拟微信API响应: {}", result.toString());
        return result;
    }
    
    /**
     * 真实的微信API调用（备用）
     */
    private JSONObject realCode2Session(String code) {
        try {
            // 这里可以调用真实的微信API
            // 为了安全起见，在生产环境中才调用
            WechatUtil wechatUtil = new WechatUtil();
            // 注意：这里需要注入真实的appid和secret
            return wechatUtil.code2Session(code);
        } catch (Exception e) {
            log.error("真实微信API调用失败，降级到模拟模式", e);
            return mockCode2Session(code);
        }
    }
    
    /**
     * 判断是否为开发环境
     */
    private boolean isDevelopmentEnvironment() {
        return "dev".equals(activeProfile) || "test".equals(activeProfile) || "local".equals(activeProfile);
    }
    
    /**
     * 解密手机号（模拟实现）
     */
    public String decryptPhone(String encryptedData, String iv, String sessionKey) {
        if (isDevelopmentEnvironment()) {
            log.info("开发环境：模拟手机号解密");
            return "13800138000"; // 模拟手机号
        }
        
        // 生产环境应该实现真实的AES解密
        throw new UnsupportedOperationException("生产环境需要实现真实的AES解密");
    }
    
    /**
     * 生成模拟code（用于测试）
     */
    public static String generateMockCode() {
        return "mock_code_" + System.currentTimeMillis();
    }
    
    /**
     * 验证code是否为模拟code
     */
    public static boolean isMockCode(String code) {
        return code != null && code.startsWith("mock_code_");
    }
}